本系列文章已重新編修,並在加入部分 ES6 新篇章後集結成書,有興趣的朋友可至天瓏書局選購,感謝大家支持。
購書連結 https://www.tenlong.com.tw/products/9789864344130
讓我們再次重新認識 JavaScript!
這篇其實跟 JavaScript 沒有太大關係,純粹是為了好玩才寫的。
因為在這篇的留言處
看到有大大把爬好的資料提供出來,師父說拿到資料不畫是棒槌 於是手癢用 D3.js 寫著玩 XD
[註] 後續在 重新認識 JavaScript 番外篇 (5) - 鐵人賽戰況分析 II 還有持續更新
首先是目前戰況的分析
可以看到到目前爲止在 Day 20 奮戰的朋友佔大多數,因為這天剛好是最終開賽日。
換句話說,停在這天之前的朋友就算是被淘汰了 QQ
然後來調查一下大家都在哪天爆掉,意外發現好多人報名後一篇都沒寫...
把沒開賽的人去掉之後,可以看出在開賽前幾日就停掉的還是佔多數。
還有人撐到 Day 27 爆掉的 QQ
原始碼如下:
d3.json("http://ironmans.goodideas-studio.com/itHelp", function(error, json) {
var data = json.topic['on going'];
var f = json.topic.topics.filter( (d) => {
return d.status !== "challenge";
});
var f_day = [];
for( let i = 0; i < 30; i++ ){ f_day[i] = 0; }
f.forEach( d => {
d.day = isNaN( d.day ) ? 0 : d.day;
f_day[ d.day ]++;
})
// 把未開賽的清掉
f_day[0] = 0;
var svg = d3.select('.svg');
// 設定畫布尺寸 & 邊距
var margin = 40,
width = 960 - margin * 2,
height = 460 - margin * 2;
svg.attr({
"width": width + margin,
"height": height + margin * 2,
"transform": "translate(" + margin + "," + margin + ")"
});
// x 軸比例尺
var xScale = d3.scale.linear()
.domain([-1, 31])
.range([0, width]);
// y 軸比例尺 給繪製矩形用
var yScale = d3.scale.linear()
.domain([0, 18])
.range([0, height]);
// y 軸比例尺 2 繪製座標軸用
var yScale2 = d3.scale.linear()
.domain([0, 18])
.range([height, 0]);
// x 軸
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom")
.ticks(31)
.tickFormat(function(v) {
return (v >= 0 && v < 31) ? v : '';
});
// y 軸
var yAxis = d3.svg.axis()
.scale(yScale2)
.orient("left");
var colors = d3.scale.category20c();
// 繪製矩形
svg.selectAll('.bar')
.data(data)
.enter()
.append('g')
.classed('bar', true)
.append('rect')
.attr({
'x': function(d, i) {
// console.log( d.day );
return xScale(i) + 13;
},
'y': function(d, i) {
return height - yScale(f_day[i]) + margin;
},
'width': '2%',
'height': function(d, i) {
return yScale(f_day[i]);
},
'fill': function(d, i) {
return colors(i);
}
});
// 繪製 x 軸
svg.append("g")
.attr({
"class": "x axis",
"transform": "translate(" + margin + "," + (height + margin) + ")",
})
.call(xAxis);
// 繪製 y 軸
svg.append("g")
.attr({
"class": "y axis",
"transform": "translate(" + margin + ", " + margin + ")",
})
.call(yAxis);
svg.append("text")
.text('人數')
.attr({
x: 10,
y: 20
});
svg.append("text")
.text('日期')
.attr({
x: 880,
y: 450
});
// 處理位移
svg.selectAll('.bar').attr('transform', 'translate(' + width * 0.02 + ', 0)');
});
按慣例還是提供 JSBin 給大家玩: http://jsbin.com/dezuzojibi/1/edit?js,output
使用的版本是 D3 v3.5.6
還未完賽的朋友們請加油 XD